package fr.miage.course7.gps;

import java.util.GregorianCalendar;

/**
 * Classe représentant une transmission.
 * @author Mickael LAROCHE
 *
 */
public class Transmission implements Comparable<Transmission> {

    /**
     * Date de la transmission.
     */
    private GregorianCalendar date;

    /**
     * Identifiant du participant.
     */
    private int idParticipant;

    /**
     * Coordonnées de la transmission.
     */
    private Position coord;

    /**
     * Constructeur.
     * @param idP l'identifiant du participant ayant effectue la transmission
     * @param dateTransmission la date de la transmission
     * @param lat la latitude du participant au moment de la transmission
     * @param lon la longitude du participant au moment de la transmission
     */
    public Transmission(final int idP,
                        final GregorianCalendar dateTransmission,
                        final int lat,
                        final int lon) {
        idParticipant = idP;
        this.date = dateTransmission;
        coord = new Position(lat, lon);
    }

    /**
     * Compare la transmission courante avec une autre selon.
     * @param t : transmission
     * @return l'entier -1, 0 ou 1 selon la norme du compareTo
     */
    public final int compareTo(final Transmission t) {
        if (idParticipant == t.idParticipant) {
            return date.compareTo(t.date);
        } else {
            if (idParticipant < t.idParticipant) {
                return -1;
            } else {
                return 1;
            }
        }
    }

    /**
     * Retourne les coordonnées de la transmission.
     * @return les coordonnées de la transmission
     */
    public final Position getCoord() {
        return coord;
    }

    /**
     * Retourne la date de la transmission.
     * @return la date de la transmission
     */
    public final GregorianCalendar getDate() {
        return date;
    }

    /**
     * Affichage.
     * @return la classe sous forme de String
     */
    @Override
    public final String toString() {
        return getClass().getSimpleName() + '@'
                + Integer.toHexString(hashCode())
                + " [idParticipant=" + idParticipant
                + ", date="    + date.get(GregorianCalendar.DAY_OF_MONTH) + "/"
                + date.get(GregorianCalendar.MONTH)    + "/"
                + date.get(GregorianCalendar.YEAR) + " "
                + date.get(GregorianCalendar.HOUR) + "h"
                + date.get(GregorianCalendar.MINUTE)
                + ", coord=(" + coord.getLat() + "," + coord.getLon() + ")]";
    }

    /**
     * Affichage XML.
     * @return la classe sous forme de document XML
     */
    public final String toXML() {
        return "<wpt lat='" + coord.getLat() + "' lon='" + coord.getLon() + "'>"
             + "<time year='" + date.get(GregorianCalendar.YEAR) + "'"
             + " month='" + date.get(GregorianCalendar.MONTH)    + "'"
             + " day='" + date.get(GregorianCalendar.DAY_OF_MONTH) + "' />"
             + "<name>" + idParticipant + "</name>"
             + "</wpt>";
    }
}
